"""
情感分析基础模型接口
定义所有情感分析模型需要实现的通用接口
"""
from abc import ABC, abstractmethod
from typing import Dict, List, Any, Optional, Tuple


class BaseSentimentModel(ABC):
    """情感分析基类，定义统一接口"""
    
    def __init__(self, config: Dict[str, Any]):
        """
        初始化情感分析模型
        
        Args:
            config: 模型配置参数
        """
        self.config = config
        self.model = None
        self.tokenizer = None
        self.is_trained = False
    
    @abstractmethod
    def train(self, train_data: List[Dict[str, Any]], val_data: Optional[List[Dict[str, Any]]] = None) -> Dict[str, float]:
        """
        训练模型
        
        Args:
            train_data: 训练数据
            val_data: 验证数据
        
        Returns:
            Dict[str, float]: 训练指标
        """
        pass
    
    @abstractmethod
    def predict(self, text: str, entities: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
        """
        预测文本中每个实体的情感
        
        Args:
            text: 输入文本
            entities: 实体列表
        
        Returns:
            List[Dict[str, Any]]: 带有情感标签的实体列表
        """
        pass
    
    @abstractmethod
    def batch_predict(self, texts: List[str], entities_list: List[List[Dict[str, Any]]]) -> List[List[Dict[str, Any]]]:
        """
        批量预测文本中每个实体的情感
        
        Args:
            texts: 输入文本列表
            entities_list: 实体列表的列表
        
        Returns:
            List[List[Dict[str, Any]]]: 带有情感标签的实体列表的列表
        """
        pass
    
    @abstractmethod
    def save(self, path: str) -> bool:
        """
        保存模型
        
        Args:
            path: 模型保存路径
        
        Returns:
            bool: 保存是否成功
        """
        pass
    
    @abstractmethod
    def load(self, path: str) -> bool:
        """
        加载模型
        
        Args:
            path: 模型加载路径
        
        Returns:
            bool: 加载是否成功
        """
        pass
    
    @abstractmethod
    def evaluate(self, test_data: List[Dict[str, Any]]) -> Dict[str, float]:
        """
        评估模型性能
        
        Args:
            test_data: 测试数据
        
        Returns:
            Dict[str, float]: 评估指标
        """
        pass


class SentimentModelFactory:
    """情感分析模型工厂类，用于创建不同类型的情感分析模型"""
    _model_implementations = {}
    
    @classmethod
    def register_model(cls, model_type: str, model_class):
        """
        注册情感分析模型实现
        
        Args:
            model_type: 模型类型
            model_class: 模型类
        """
        cls._model_implementations[model_type] = model_class
    
    @classmethod
    def create_model(cls, model_type: str, config: Dict[str, Any]) -> BaseSentimentModel:
        """
        创建情感分析模型实例
        
        Args:
            model_type: 模型类型
            config: 模型配置
        
        Returns:
            BaseSentimentModel: 情感分析模型实例
        
        Raises:
            ValueError: 模型类型不存在
        """
        if model_type not in cls._model_implementations:
            raise ValueError(f"不支持的情感分析模型类型: {model_type}")
        
        return cls._model_implementations[model_type](config)